/**
 *
 */
package co.gov.medellin.ssti.sub.paoyer.common.exception;

import javax.ejb.EJBException;

/**
 * Representa una excepcion que se genera exclusivamente por un comportamiento
 * no deseado de la aplicacion.
 * 
 * Esta clase se crea cuando, por ejemplo, la comunicacion con algun sub-sistema
 * se ve interrumpida inesperadamente.
 * 
 * @version 0.9.1
 */
public class BaseException extends EJBException {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3616014703527884059L;

	/**
	 * Nombre de la Clase Excepcion correspondiente al modulo
	 */
	protected ModuleVO moduleVO;

	/**
	 * Identificador de la Excepcion dentro del Modulo
	 */
	protected int messageId;

	/**
	 * Mensaje personalizado de error.
	 */
	protected String customMessage;

	/**
	 * Constructores.
	 */
	public BaseException() {
	}

	public BaseException(String s) {
		super(s);
	}

	public BaseException(ModuleVO moduleVO, int messageId) {
		this(moduleVO, messageId, null);
	}

	public BaseException(ModuleVO moduleVO, int messageId, String customMessage) {
		super(ModuleExceptionFactory
				.getModuleException(moduleVO.getExceptionClass())
				.getExceptionVO(messageId).toString()
				+ "Mensaje Personalizado = " + customMessage);

		this.moduleVO = moduleVO;
		this.messageId = messageId;
		this.customMessage = customMessage;
	}

	/**
	 * Devuelve el mensaje personalizado guardado para una excepci�n.
	 * 
	 * @return String
	 */
	public String getCustomMessage() {
		return this.customMessage;
	}

	/**
	 * Devuelve informaci�n detallada de una excepci�n, representada en un
	 * objeto ExceptionVO.
	 * 
	 * @return ExceptionVO
	 */
	public ExceptionVO getExceptionVO() {
		// Solicita una ModuleException de tipo User
		try {
			ModuleExceptionInterface exception = null;
			exception = ModuleExceptionFactory.getModuleException(this.moduleVO
					.getExceptionClass());

			return exception.getExceptionVO(this.messageId);
		} catch (BaseException ex) {
			return new ExceptionVO(
					CommonSystemException.IDENTIFY_EXCEPTION_NOT_FOUND, "", "");
		}
	}

	/**
	 * Devuelve solo un mensaje sobre la excepcion en cuestion.
	 * 
	 * @return String
	 */
	public String getMessage() {
		String messageInitialToken = " ME=[[";
		String finalToken = "]] ";
		// String javaExceptionString = "";
		String customMessageString = "";

		try {
			// Solicita una ModuleException de tipo System
			ModuleExceptionInterface exception = ModuleExceptionFactory
					.getModuleException(this.moduleVO.getExceptionClass());

			if (this.customMessage != null) {
				customMessageString = messageInitialToken + this.customMessage
						+ finalToken;
			}

			return exception.getExceptionVO(this.messageId).toString()
					+ customMessageString;
		} catch (ExceptionIdNotFound ex) {
			return ex.toString();
		} catch (BaseException ex) {
			return ex.getExceptionVO().toString();
		}
	}
}